﻿// INGENIOUS FRAMEWORK - Semantic Web Development Simplified
// Copyright (C) 2012 Linked Data Tools

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Ingenious.Graph;

namespace Ingenious.Core
{
    #region Supporting Classes
    public enum TripleChangeType
    {
        Add,
        Modify,
        Remove,
    }
    #endregion

    /// <summary>
    /// Represents a triple change unit
    /// </summary>
    /// <typeparam name="TTripleId">The storage ID of the triple</typeparam>
    public class TripleChange<TTripleId>
    {
        private readonly Graph<TTripleId> m_graph;
        private readonly Triple<TTripleId> m_triple;
        private readonly TripleChangeType m_tripleChangeType;

        #region Object Lifetime
        public TripleChange(Graph<TTripleId> graph, Triple<TTripleId> triple, TripleChangeType tripleChangeType)
        {
            if (graph == null)
            {
                throw new ArgumentNullException("graph");
            }
            
            if (triple == null)
            {
                throw new ArgumentNullException("tripleChange");
            }

            if (tripleChangeType == null)
            {
                throw new ArgumentNullException("tripleChangeType");
            }

            m_graph = graph;
            m_triple = triple;
            m_tripleChangeType = tripleChangeType;
        }
        #endregion

        #region Object Overrides
        public override bool Equals(object obj)
        {
            return obj is TripleChange<TTripleId> && ((TripleChange<TTripleId>)obj).Triple.ID.Equals(Triple.ID);
        }

        public override int GetHashCode()
        {
            return m_triple.ID.GetHashCode();
        }
        #endregion

        #region Properties
        public Graph<TTripleId> Graph
        {
            get { return m_graph; }
        }

        public Triple<TTripleId> Triple
        {
            get { return m_triple; }
        }

        public TripleChangeType TripleChangeType
        {
            get { return m_tripleChangeType; }
        }
        #endregion
    }
}